// MoreAEM.h is needed because methods defined in this
// file take TDescriptors as pass-by-value parameters,
// which requires the complete definition of the class
// TDescriptor.
//
#include "MoreAEM.h"
//
// Object.h is needed because TObject is the base class of
// TAbstractScriptableObject, and for the DeclareClassData macros.
//
#include "Object.h"
//
// TAbstractSearchSpec represents a specification for a
// test to be done in a search (e.g. during whose clause resolution).
// TSearchSpecList is, of course, a list of TAbstractSearchSpecs.
//
class TAbstractSearchSpec;
template <class T> class AListOf;
//
// Abstract references are 'abreviated' representations of some
// other scriptable object
//
class TAbstractReference;
//
// An abstract object iterator knows how to iterate over some
// list of TAbstractScriptableObjects.
//
class TAbstractObjectIterator;
//
// A list of TAbstractScriptableObjects
//
class TAbstractScriptableObject;
template <class T> class AListOf;
//
// An object that represents data to compare; could be literal
// data, or a description of a property of some object.
//
class TComparisonOperand;
#define clScriptableObject 2
#define clDesignator 3
#define clProperty 4
#define clGenericProperty 5
#define clProxyToken 6
#define clMarkToken 7
#define clEveryItem 8
#define clEntireContents 9
// #define clCollectorBehavior 11
#define clSearchSpec 12
#define clLogicalSearchSpec 13
#define clGenericSearchSpec 14
#define clSearchEngine 15
#define kObjectRecordedClass true
//
// There are three types of mark tokens:
//
// kSingleItemOrCollection - example: the selection--but the selection is not
// a mark token, so this mark type is never used.
// Returns either a single item or a collection of
// items. Operations on the elements of the mark
// operate on the items in the collection.
//
// kSingleItemOrUnion - example: access by name. Returns either a single
// item or a union set of items. Operations on
// the elements of the mark operate on the union of
// every element of every item in the set
//
// kAlwaysMakeCollection - example: whose clauses. Always returns a collection
// of items, even if there is only one item in the
// collection. This is done so that the result of
// a whose clause is always a list, even if only one
// item is returned.
//
// Special case:
//
// kPropertyUnion - only used with collections of properties gathered
// from a proxy token. Behaves like kSingleItemOrUnion,
// but changes behavior of best type and default type
// for the collection.
//
enum TypeOfMarkToken
{
kSingleItemOrUnion,
kSingleItemOrCollection,
kPropertyUnion,
kAlwaysMakeCollection
};
//
// The magic value kNeverCreateGenericProperty should be placed in
// property tables in any instance where a generic property should
// never be created. Usually this is not needed, as the correct
// property token should be created in AccessByProperty; however, in
// some cases a property is constructed from the property table
// without calling AccessByProperty (for example, to make a property
// of a proxy token); in that case, this value will prevent the incorrect
// type of property from being created.
//
// The magic value kDontIncludeInPropertiesProperty should be placed
// in the property tables in any instance where a property is included
// for definition purposes, but said property should not be part of
// the "properties" property.
//
// These special values may be ORed together. The low shortword of
// the additional info is still usable by clients if the special values
// are used. And with 'kReservedRangeUsableByClients' to mask out
// the special range when using the additional info if this is done.
// If the value stored in the additional info field is less than
// 0x7F000000, then the entire longword is usable by the client.
//
enum
{
kReservedRangeForPropertyInfo = 0x7F000000, // Values in the property additional info >= this value have special meanings
kReservedRangeUsableByClients = 0x0000FFFF, // When the reserved range is used, clients may define the short word of this property to be whatever they wish
kNeverCreateGenericBit = 0x00800000,
kDontIncludeInPropertiesPropertyBit = 0x00400000,
kBestTypeIsSameAsDefaultTypeBit = 0x00200000, // Set this bit to make BestType == DefaultType; the BestType field may then be used for something else